package com.test.springCloud.utils;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class DataUtil {

	private static DataUtil dataUtil;

	/**
	 * 将字符串时间转换为java.sql.Date类型 格式：yyyy-MM-dd HH:mm:ss 对于不正确的格式会抛出为空
	 * 
	 * @param strDate
	 * @return
	 */
	public static Timestamp strToDate(String strDate) {

		String str = strDate;
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date d = null;
		try {
			d = format.parse(str);
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return new Timestamp(d.getTime());
	}

	private DataUtil() {
	}

	public static DataUtil getSingleton() {
		if (dataUtil == null)
			dataUtil = new DataUtil();
		return dataUtil;
	}

	/**
	 * 无参返回当前系统时间 规范1
	 * 
	 * @return
	 */
	public String currTime() {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String currTime = df.format(new Date());
		return currTime;
	}

	/**
	 * 无参返回当前今天日期 规范2
	 * 
	 * @return
	 */
	public String currTodayDate() {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		String currTime = df.format(new Date());
		return currTime;
	}

	/**
	 * 无参返回当前今天日期
	 * 
	 * @return
	 */
	public String currTodayDateNorm2() {
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
		String currTime = df.format(new Date());
		return currTime;
	}

	/**
	 * 无参返回当前系统时间(包含毫秒数) 规范2
	 * 
	 * @return
	 */
	public String currTimeMillNorm2() {
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		String currTime = df.format(new Date());
		return currTime;
	}

	/**
	 * 无参返回当前系统时间(包含毫秒数)
	 * 
	 * @return
	 */
	public String currTimeMill() {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ssSSS");
		String currTime = df.format(new Date());
		return currTime;
	}

	/**
	 * 时间戳转换为自定义格式时间
	 * 
	 * @param dateFormat
	 * @param millSec
	 * @return
	 */
	public String transferLongToDate(String dateFormat, Long millSec) {
		SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
		Date date = new Date(millSec);
		return sdf.format(date);
	}

	/**
	 * 这个类偏业务类 获取当前时间String类型，格式为：yyyy-MM-dd HH:mm:ss
	 * 
	 * @return
	 */
	public static String GetCurrDateStr() {
		DataUtil dataUtil = new DataUtil();
		long currDateMill = new Date().getTime();
		return dataUtil.transferLongToDate("yyyy-MM-dd HH:mm:ss", currDateMill);
	}

	/**
	 * 这个类偏业务类 获取3分钟前的那个时间String类型，格式为：yyyy-MM-dd HH:mm:ss
	 * 
	 * @return
	 */
	public static String GetTodayAfterDateStr() {
		DataUtil dataUtil = new DataUtil();
		long currDateMill = new Date().getTime();
		currDateMill -= 1 * 300 * 1000;
		return dataUtil.transferLongToDate("yyyy-MM-dd HH:mm:ss", currDateMill);
	}

	/**
	 * 这个类偏业务类 获取?分钟前的那个时间String类型，格式为：yyyy-MM-dd HH:mm:ss
	 * 
	 * @return
	 */
	public static String GetTodayAfterNowDateStr(int howtimeafter) {
		DataUtil dataUtil = new DataUtil();
		long currDateMill = new Date().getTime();
		currDateMill -= 1 * howtimeafter * 1000;
		return dataUtil.transferLongToDate("yyyy-MM-dd HH:mm:ss", currDateMill);
	}

	/**
	 * 获取当前时间戳
	 * 
	 * @return
	 */
	public String GetTimestamp() {
		Long startTs = System.currentTimeMillis();
//		return new Date().getTime();		
		return startTs.toString();
	}

	/**
	 * String版本 比较时间大小，根据结果确定不同返回值 Example date1："2021-09-16
	 * 14:01:02",data2:"2021-09-11 11:01:01"
	 * 
	 * @param date1
	 * @param date2
	 * @return 1
	 */
	public static int dateCompare(String date1, String date2) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

		if (date1.compareTo(date2) > 0) {
//		    System.out.println("Date1 时间在 Date2 之后");
			return -1;
		} else if (date1.compareTo(date2) < 0) {
//		    System.out.println("Date1 时间在 Date2 之前");
			return 1;
		} else if (date1.compareTo(date2) == 0) {
//		    System.out.println("Date1 时间与 Date2 相等");
			return 0;
		} else {
//		    System.out.println("程序怎么会运行到这里?正常应该不会");
			return 99;
		}
	}

	/**
	 * Date版本 比较时间大小，根据结果确定不同返回值
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public int dateCompare(Date date1, Date date2) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

		if (date1.compareTo(date2) > 0) {
//		    System.out.println("Date1 时间在 Date2 之后");
			return 1;
		} else if (date1.compareTo(date2) < 0) {
//		    System.out.println("Date1 时间在 Date2 之前");
			return -1;
		} else if (date1.compareTo(date2) == 0) {
//		    System.out.println("Date1 时间与 Date2 相等");
			return 0;
		} else {
//		    System.out.println("程序怎么会运行到这里?正常应该不会");
			return 99;
		}
	}

	/**
	 * 无参返回今天0点0分0秒
	 * 
	 * @return
	 */
	public static String zeroTimeToday() {
		long current = System.currentTimeMillis();// 当前时间毫秒数
		long zero = current / (1000 * 3600 * 24) * (1000 * 3600 * 24) - TimeZone.getDefault().getRawOffset();// 今天零点零分零秒的毫秒数
//        long twelve=zero+24*60*60*1000-1;//今天23点59分59秒的毫秒数
//        long yesterday=System.currentTimeMillis()-24*60*60*1000;//昨天的这一时间的毫秒数
//        System.out.println(new Timestamp(current));//当前时间
//        System.out.println(new Timestamp(yesterday));//昨天这一时间点
//        System.out.println(new Timestamp(twelve));//今天23点59分59秒
		return String.valueOf(new Timestamp(zero));
	}

	/**
	 * Purpose:获取当天23时23分59秒的时间
	 * 
	 * @author Hermanwang
	 * @return
	 * @return Date
	 */
	public static String todayLastDate() {
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, 23);
		calendar.set(Calendar.MINUTE, 59);
		calendar.set(Calendar.SECOND, 59);
		calendar.set(Calendar.MILLISECOND, 999);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String dateStr = sdf.format(calendar.getTime());
		return dateStr;
	}

}
